package priv.conceit.study.book.lambda.chapter5;

import java.util.*;
import java.util.stream.Collectors;
import org.junit.Assert;
import org.junit.Test;


import static java.util.Arrays.asList;
import static junit.framework.TestCase.assertEquals;

/**
 * 高级集合类 和 收集器
 * 5.2
 * 元素顺序
 *
 *
 * @author Conceit
 * @since 1.0.0, 2021/9/27
 */
public class ElementOrdering {

    public static void main(String[] args) {

        //流按照出现顺序排序
        List<Integer> ListNumbers=asList(1,2,3,4);
        List<Integer> streamListNumbers=ListNumbers.stream().collect(Collectors.toList());
        //System.out.println(ListNumbers.equals(streamListNumbers));

        //set 无序 不能保证每次通过
        //集合本身剩无序，那么生成的流也是无序的
        Set<Integer> setNumbers=new HashSet<>(asList(4,3,2,1));
        List<Integer> streamSetNumbers=setNumbers.stream().collect(Collectors.toList());
        System.out.println(streamSetNumbers.equals(asList(4,3,2,1)));
        //assertEquals(asList(1,2,3,4),streamSetNumbers);
        //assertEquals(asList(4,3,2,1),streamSetNumbers);



        //有些中间操作会产生顺序
        List<Integer> streamSetOrderNumbers=setNumbers.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        //System.out.println(setNumbers.equals(streamSetOrderNumbers));

        //一些操作在有序的流上开销更大，可以调用unordered方法消除
        //多数操作在有序流上效率更高，比如filter map和reduce
        //但是使用 并行流时，foreach方法不能保证按照顺序执行，此时可以使用forEachOrdered方法
    }


}
